# -*- coding: utf-8 -*-
"""
    xfree.display.navigation
    ~~~~~~~~~~~~~~~~~~~~~~~~~~
    文件描述：这个模块包含了在 XFree 模板中创建导航元素的辅助函数。
    作者：xfree
    邮箱：cy_83k@qq.com
"""

from abc import ABC, abstractproperty
from enum import Enum

import attr

# 定义模块中所有公开的类名
__all__ = (
    "NavigationContentType",
    "NavigationLink",
    "NavigationExternalLink",
    "NavigationHeader",
    "NavigationDivider",
)


class NavigationContentType(Enum):
    """
    导航内容类型枚举。
    """

    link = 0
    external_link = 1
    header = 2
    divider = 3


class NavigationItem(ABC):
    """
    抽象导航项类。不用于直接使用，但为导航项提供了通用接口。
    """

    # 抽象属性，表示内容类型
    content_type = abstractproperty(lambda: None)


@attr.s(eq=True, order=True, hash=True, repr=True, frozen=True, slots=True)
class NavigationLink(NavigationItem):
    """
    表示一个内部 xfree 导航链接。

    示例：
        NavigationLink(
            endpoint="user.profile",
            name="{}'s Profile".format(user.username),
            icon="fa fa-home",
            active=False,  # 默认值
            urlforkwargs={"username": user.username}
        )
    """

    endpoint = attr.ib()
    name = attr.ib()
    icon = attr.ib(default="")
    active = attr.ib(default=False)
    urlforkwargs = attr.ib(factory=dict)
    # 指定内容类型为链接
    content_type = NavigationContentType.link


@attr.s(eq=True, order=True, hash=True, repr=True, frozen=True, slots=True)
class NavigationExternalLink(NavigationItem):
    """
    表示一个外部导航链接。

    示例：
        NavigationExternalLink(
            uri="mailto:{}".format(user.email),
            name="Email {}".format(user.username),
            icon="fa fa-at"
        )
    """

    uri = attr.ib()
    name = attr.ib()
    icon = attr.ib(default="")
    # 指定内容类型为外部链接
    content_type = NavigationContentType.external_link


@attr.s(eq=True, order=True, hash=True, repr=True, frozen=True, slots=True)
class NavigationHeader(NavigationItem):
    """
    表示导航栏中的标题文本。

    示例：
        NavigationHeader(
            text="A header",
            icon="fa fa-exclamation"
        )
    """

    text = attr.ib()
    icon = attr.ib(default="")
    # 指定内容类型为标题
    content_type = NavigationContentType.header


@attr.s(eq=True, order=True, hash=True, repr=True, frozen=True, slots=True)
class NavigationDivider(NavigationItem):
    """
    表示导航栏中的分隔线。

    示例：
        NavigationDivider()
    """

    # 指定内容类型为分隔线
    content_type = NavigationContentType.divider